//
// Created by aruba on 2020/10/21.
//

#ifndef FFMPEGSYNCAPPLICATION_FFMPEG_DECODER_H
#define FFMPEGSYNCAPPLICATION_FFMPEG_DECODER_H

#include "queue"
#include "pthread.h"
#include <android/log.h>

extern "C" {
//编码
#include "libavcodec/avcodec.h"
//封装格式处理
#include "libavformat/avformat.h"
#include "libswresample/swresample.h"
//像素处理
#include "libswscale/swscale.h"
#include "_opensl_helper.h"
#include <libavutil/time.h>
}

#define  LOG_TAG_FFMPEG_DECODER    "_ffmpeg_decoder"

class FFmpegDecoder {
public:
    //是否正在播放
    bool isPlay;
    //流索引
    int stream_idx;
    //解码器
    AVCodecContext *codecContext = NULL;
    //数据队列
    std::queue<AVPacket *> queue;

    //处理线程
    pthread_t p_playid;
    //同步锁
    pthread_mutex_t mutex;
    //条件变量
    pthread_cond_t cond;
    //一秒中有多少帧
    AVRational time_base;
    //播放时间
    double clock;
    
    FFmpegDecoder();

    //设置解码器
    void setAvCodecContext(AVCodecContext *codecContext);

    //从队列中获取一帧数据(消费者)
    int get(AVPacket *packet);

    //将一帧数据放入队列(生产者)
    int put(AVPacket *packet);

    virtual void stop();

    //派生类需要实现的方法，用于实现play方法
    virtual void play() = 0;

    ~FFmpegDecoder();

protected:
    //开启播放线程，子类调用
    void startPlay(void *play(void *), void *arg);
};


#endif //FFMPEGSYNCAPPLICATION_FFMPEG_DECODER_H
